package model

import (
	"time"

	"gorm.io/gorm"
)

// Address 地址表
type Address struct {
	ID            int64          `gorm:"primaryKey;autoIncrement" json:"id"`
	UserID        int64          `gorm:"index;not null;comment:用户ID" json:"userId"`
	Province      string         `gorm:"type:varchar(50);not null;comment:省份" json:"province"`
	City          string         `gorm:"type:varchar(50);not null;comment:城市" json:"city"`
	District      string         `gorm:"type:varchar(50);not null;comment:区县" json:"district"`
	Address       string         `gorm:"type:varchar(200);not null;comment:详细地址" json:"address"`
	ReceiverName  string         `gorm:"type:varchar(50);not null;comment:收货人姓名" json:"receiverName"`
	ReceiverPhone string         `gorm:"type:varchar(11);not null;comment:收货人电话" json:"receiverPhone"`
	IsDefault     bool           `gorm:"default:false;comment:是否默认地址" json:"isDefault"`
	CreatedAt     time.Time      `json:"createdAt"`
	UpdatedAt     time.Time      `json:"updatedAt"`
	DeletedAt     gorm.DeletedAt `gorm:"index" json:"-"`
}

func (Address) TableName() string {
	return "addresses"
}

// ==================== 模型方法 ====================

// GetByID 根据ID获取地址
func (a *Address) GetByID(db *gorm.DB, id, userID int64) error {
	return db.Where("id = ? AND user_id = ?", id, userID).First(a).Error
}

// GetListByUserID 获取用户的地址列表
func GetAddressListByUserID(db *gorm.DB, userID int64) ([]Address, error) {
	var addresses []Address
	err := db.Where("user_id = ?", userID).
		Order("is_default DESC, id DESC").
		Find(&addresses).Error
	return addresses, err
}

// Create 创建地址
func (a *Address) Create(db *gorm.DB) error {
	// 如果设为默认地址，先取消其他默认地址
	if a.IsDefault {
		db.Model(&Address{}).
			Where("user_id = ?", a.UserID).
			Update("is_default", false)
	}

	// 如果是第一个地址，自动设为默认
	var count int64
	db.Model(&Address{}).Where("user_id = ?", a.UserID).Count(&count)
	if count == 0 {
		a.IsDefault = true
	}

	a.CreatedAt = time.Now()
	a.UpdatedAt = time.Now()
	return db.Create(a).Error
}

// Update 更新地址
func (a *Address) Update(db *gorm.DB, updates map[string]interface{}) error {
	updates["updated_at"] = time.Now()
	return db.Model(a).Updates(updates).Error
}

// Delete 删除地址
func (a *Address) Delete(db *gorm.DB, userID int64) error {
	if err := db.Delete(a).Error; err != nil {
		return err
	}

	// 如果删除的是默认地址，将下一个地址设为默认
	if a.IsDefault {
		var nextAddress Address
		err := db.Where("user_id = ?", userID).First(&nextAddress).Error
		if err == nil {
			db.Model(&nextAddress).Update("is_default", true)
		}
	}

	return nil
}

// SetDefault 设置为默认地址
func (a *Address) SetDefault(db *gorm.DB) error {
	// 开启事务
	tx := db.Begin()

	// 取消其他默认地址
	if err := tx.Model(&Address{}).
		Where("user_id = ?", a.UserID).
		Update("is_default", false).Error; err != nil {
		tx.Rollback()
		return err
	}

	// 设置当前地址为默认
	if err := tx.Model(a).Update("is_default", true).Error; err != nil {
		tx.Rollback()
		return err
	}

	return tx.Commit().Error
}
